package com.stone.customer.console.job;

import com.stone.message.adapter.domain.bo.TriggerMessageParam;
import com.stone.message.adapter.trigger.AbstractCommonReceiverTrigger;
import com.stone.starter.core.exception.CommonException;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotNull;
import java.util.Map;
import java.util.Objects;

/**
 * 抽象触发器job
 *
 * @author Mr_wenpan@163.com 2021/07/15 21:43
 */
public abstract class AbstractCustomerTriggerJob<T, K> {

    private final String DEFAULT_THREAD_NUM = "1";

    private final String THREAD_NUM = "threadNum";

    /**
     * job执行时自动调用的方法
     *
     * @param params job参数
     * @author Mr_wenpan@163.com 2021/7/15 9:44 下午
     */
    public void autoExecuteJob(Map<String, String> params) {
        String threadNum = params.getOrDefault(THREAD_NUM, DEFAULT_THREAD_NUM);
        AbstractCommonReceiverTrigger<T, K> trigger = getTrigger();
        if (StringUtils.isBlank(queue())) {
            // 一般job这里都可以获取到job名称，我这里只是测试
            throw new CommonException("xxxJob的queue为空，无法执行，请正确赋值queue！");
        }
        if (Objects.isNull(trigger)) {
            // 一般job这里都可以获取到job名称，我这里只是测试
            throw new CommonException("xxxJob的触发器为空，无法执行！");
        }

        TriggerMessageParam<K> triggerMessageParam = TriggerMessageParam.<K>builder()
                .queryDataParam(null)
                .queue(queue())
                .taskCount(1)
                .build();
        trigger.triggerWithCheck(triggerMessageParam, (x, y) -> {

            // todo 错误补偿方式

        });
    }

    /**
     * 队列
     *
     * @return java.lang.String
     * @author Mr_wenpan@163.com 2021/7/15 9:50 下午
     */
    protected abstract @NotNull String queue();

    /**
     * 获取具体的触发器，具体执行那种触发器的方法由子类自己决定
     *
     * @return com.message.adapter.trigger.AbstractCommonTrigger
     * @author Mr_wenpan@163.com 2021/7/15 10:09 下午
     */
    protected abstract @NotNull AbstractCommonReceiverTrigger<T, K> getTrigger();
}
